home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / macos / uae069b2.src.cpt.hqx / UAE069ß2.SRC.CPT / uae069fl2.src / hardfile.c < prev    next >
C/C++ Source or Header  |  1997-06-13  |  6KB  |  265 lines

  1.  /*
  2.   * UAE - The Un*x Amiga Emulator
  3.   *
  4.   * AutoConfig devices
  5.   *
  6.   * (c) 1995 Bernd Schmidt
  7.   */
  8.  
  9. #include "sysconfig.h"
  10. #include "sysdeps.h"
  11.  
  12. #include "config.h"
  13. #include "options.h"
  14. #include "my_memory.h"
  15. #include "custom.h"
  16. #include "readcpu.h"
  17. #include "newcpu.h"
  18. #include "disk.h"
  19. #include "xwin.h"
  20. #include "autoconf.h"
  21. #include "execlib.h"
  22.  
  23. static int opencount = 0;
  24. int uaedevfd;
  25. int numtracks = 512;
  26.  
  27. static uae_u32 hardfile_open(void)
  28. {
  29.     uaecptr tmp1 = m68k_areg(regs, 1); /* IOReq */
  30.  
  31.     /* Check unit number */
  32.     if (m68k_dreg(regs, 0) == 0) {
  33.     opencount++;
  34.     put_word (m68k_areg(regs, 6)+32, get_word (m68k_areg(regs, 6)+32) + 1);
  35.     put_long (tmp1+24, 0); /* io_Unit */
  36.     put_byte (tmp1+31, 0); /* io_Error */
  37.     put_byte (tmp1+8, 7); /* ln_type = NT_REPLYMSG */
  38.     return 0;
  39.     }
  40.  
  41.     put_long (tmp1+20, (uae_u32)-1);
  42.     put_byte (tmp1+31, (uae_u8)-1);
  43.     return (uae_u32)-1;
  44. }
  45.  
  46. static uae_u32 hardfile_close(void)
  47. {
  48.     opencount--;
  49.     put_word (m68k_areg(regs, 6)+32, get_word (m68k_areg(regs, 6)+32) - 1);
  50.  
  51.     return 0;
  52. }
  53.  
  54. static uae_u32 hardfile_expunge(void)
  55. {
  56.     return 0; /* Simply ignore this one... */
  57. }
  58.  
  59. static uae_u32 hardfile_beginio(void)
  60. {
  61.     uae_u32 tmp1, tmp2, dataptr, offset;
  62.     uae_u32 retval = m68k_dreg(regs, 0);
  63.  
  64.     tmp1 = m68k_areg(regs, 1);
  65. //#define DEBUGME
  66. #ifdef DEBUGME
  67.     printf ("hardfile: tmp1 = %08lx\n", (unsigned long)tmp1);
  68.     printf ("hardfile: cmd  = %d\n", (int)get_word(tmp1+28));
  69. #endif
  70.     
  71.     put_byte (tmp1+8, NT_MESSAGE);
  72.     put_byte (tmp1+31, 0); /* no error yet */
  73.     tmp2 = get_word (tmp1+28); /* io_Command */
  74. /*    put_byte (tmp1 + 30, get_byte (tmp1 + 30) & ~1);*/
  75.     switch (tmp2) {
  76.      case CMD_READ:
  77.     dataptr = get_long (tmp1 + 40);
  78.     if (dataptr & 1)
  79.         goto bad_command;
  80.     offset = get_long (tmp1 + 44);
  81.     if (offset & 511)
  82.         goto bad_command;
  83.     tmp2 = get_long (tmp1 + 36); /* io_Length */
  84.     if (tmp2 & 511)
  85.         goto bad_command;
  86.     if (tmp2 + offset > (uae_u32)numtracks * 32 * 512)
  87.         goto bad_command;
  88.  
  89.     put_long (tmp1 + 32, tmp2); /* set io_Actual */
  90.     lseek (uaedevfd, offset, SEEK_SET);
  91.     while (tmp2) {
  92.         int i;
  93.         char buffer[512];
  94.         read (uaedevfd, buffer, 512);
  95.         for (i = 0; i < 512; i++, dataptr++)
  96.         put_byte(dataptr, buffer[i]);
  97.         tmp2 -= 512;
  98.     }
  99.     break;
  100.  
  101.      case CMD_WRITE:
  102.      case 11: /* Format */
  103.     dataptr = get_long (tmp1 + 40);
  104.     if (dataptr & 1)
  105.         goto bad_command;
  106.     offset = get_long (tmp1 + 44);
  107.     if (offset & 511)
  108.         goto bad_command;
  109.     tmp2 = get_long (tmp1 + 36); /* io_Length */
  110.     if (tmp2 & 511)
  111.         goto bad_command;
  112.     if (tmp2 + offset > (uae_u32)numtracks * 32 * 512)
  113.         goto bad_command;
  114.  
  115.     put_long (tmp1 + 32, tmp2); /* set io_Actual */
  116.     lseek (uaedevfd, offset, SEEK_SET);
  117.     while (tmp2) {
  118.         char buffer[512];
  119.         int i;
  120.         for (i=0; i < 512; i++, dataptr++)
  121.         buffer[i] = get_byte(dataptr);
  122.         write (uaedevfd, buffer, 512);
  123.         tmp2 -= 512;
  124.     }
  125.     break;
  126.  
  127.     bad_command:
  128.     break;
  129.  
  130.      case 18: /* GetDriveType */
  131.     put_long (tmp1 + 32, 1); /* not exactly a 3.5" drive, but... */
  132.     break;
  133.  
  134.      case 19: /* GetNumTracks */
  135.     put_long (tmp1 + 32, numtracks);
  136.     break;
  137.  
  138.     /* Some commands that just do nothing and return zero */
  139.      case CMD_UPDATE:
  140.      case CMD_CLEAR:
  141.      case 9: /* Motor */
  142.      case 10: /* Seek */
  143.      case 12: /* Remove */
  144.      case 13: /* ChangeNum */
  145.      case 14: /* ChangeStatus */
  146.      case 15: /* ProtStatus */
  147.      case 20: /* AddChangeInt */
  148.      case 21: /* RemChangeInt */
  149.     put_long (tmp1+32, 0); /* io_Actual */
  150.     retval = 0;
  151.     break;
  152.  
  153.      default:
  154.     /* Command not understood. */
  155.     put_byte (tmp1+31, (uae_u8)-3); /* io_Error */
  156.     retval = 0;
  157.     break;
  158.     }
  159. #if 0
  160.     if ((get_byte (tmp1+30) & 1) == 0) {
  161.     /* Not IOF_QUICK -- need to ReplyMsg */
  162.     m68k_areg(regs, 1) = tmp1;
  163.     CallLib (get_long(4), -378);
  164.     }
  165. #endif
  166.     return retval;
  167. }
  168.  
  169. static uae_u32 hardfile_abortio(void)
  170. {
  171.     return (uae_u32)-3;
  172. }
  173.  
  174. void hardfile_install(void)
  175. {
  176.     uae_u32 functable, datatable, inittable;
  177.     uae_u32 initcode, openfunc, closefunc, expungefunc;
  178.     uae_u32 beginiofunc, abortiofunc;
  179.  
  180.     uaedevfd = open (currprefs.hf0, O_RDWR | O_BINARY);
  181.  
  182.     ROM_hardfile_resname = ds("hardfile.device");
  183.     ROM_hardfile_resid = ds("UAE hardfile.device 0.2");
  184.  
  185.     numtracks = hardfile_size / 16384;
  186.  
  187.     /* initcode */
  188. #if 0
  189.     initcode = here();
  190.     calltrap(deftrap(hardfile_init)); dw(RTS);
  191. #else
  192.     initcode = filesys_initcode;
  193. #endif
  194.     /* Open */
  195.     openfunc = here();
  196.     calltrap(deftrap(hardfile_open)); dw(RTS);
  197.  
  198.     /* Close */
  199.     closefunc = here();
  200.     calltrap(deftrap(hardfile_close)); dw(RTS);
  201.  
  202.     /* Expunge */
  203.     expungefunc = here();
  204.     calltrap(deftrap(hardfile_expunge)); dw(RTS);
  205.  
  206.     /* BeginIO */
  207.     beginiofunc = here();
  208.     calltrap(deftrap(hardfile_beginio));
  209.     dw (0x48E7); dw (0x8002); /* movem.l d0/a6,-(a7) */
  210.     dw (0x0829); dw (0); dw (30); /* btst #0,30(a1) */
  211.     dw (0x6608); /* bne.b +8 */
  212.     dw (0x2C78); dw (0x0004); /* move.l 4,a6 */
  213.     dw (0x4EAE); dw (-378); /* jsr ReplyMsg(a6) */
  214.     dw (0x4CDF); dw (0x4001); /* movem.l (a7)+,d0/a6 */
  215.     dw(RTS);
  216.  
  217.     /* AbortIO */
  218.     abortiofunc = here();
  219.     calltrap(deftrap(hardfile_abortio)); dw(RTS);
  220.  
  221.     /* FuncTable */
  222.     functable = here();
  223.     dl(openfunc); /* Open */
  224.     dl(closefunc); /* Close */
  225.     dl(expungefunc); /* Expunge */
  226.     dl(EXPANSION_nullfunc); /* Null */
  227.     dl(beginiofunc); /* BeginIO */
  228.     dl(abortiofunc); /* AbortIO */
  229.     dl(0xFFFFFFFFul); /* end of table */
  230.  
  231.     /* DataTable */
  232.     datatable = here();
  233.     dw(0xE000); /* INITuae_s8 */
  234.     dw(0x0008); /* LN_TYPE */
  235.     dw(0x0300); /* NT_DEVICE */
  236.     dw(0xC000); /* INITuae_s32 */
  237.     dw(0x000A); /* LN_NAME */
  238.     dl(ROM_hardfile_resname);
  239.     dw(0xE000); /* INITuae_s8 */
  240.     dw(0x000E); /* LIB_FLAGS */
  241.     dw(0x0600); /* LIBF_SUMUSED | LIBF_CHANGED */
  242.     dw(0xD000); /* INITuae_s16 */
  243.     dw(0x0014); /* LIB_VERSION */
  244.     dw(0x0004); /* 0.4 */
  245.     dw(0xD000);
  246.     dw(0x0016); /* LIB_REVISION */
  247.     dw(0x0000);
  248.     dw(0xC000);
  249.     dw(0x0018); /* LIB_IDSTRING */
  250.     dl(ROM_hardfile_resid);
  251.     dw(0x0000); /* end of table */
  252.  
  253.     ROM_hardfile_init = here();
  254.     dl(0x00000100); /* ??? */
  255.     dl(functable);
  256.     dl(datatable);
  257.     dl(initcode);
  258.  
  259.     if (uaedevfd >= 0) {
  260.     uaecptr initfunc;
  261.     
  262.     add_filesys_unit(NULL, "hardfile", 1);
  263.     }
  264. }
  265.